/**
 * javaHispano 2008
 */
package org.javahispano.jwitter.view.validator;

import java.util.regex.Pattern;

import org.apache.log4j.Logger;
import org.javahispano.jwitter.services.RegistroService;
import org.javahispano.jwitter.view.command.UsuarioCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

/**
 * @author javaHispano
 * Validador usado en el registro de un nuevo usuario
 */
public class UsuarioValidator implements Validator{

	private static Logger log = Logger.getLogger(UsuarioValidator.class);
	
	@Autowired
	private RegistroService registroService;
	
	private String emailRegularExpression; 
	
	private Pattern pattern;
	
	/**
	 * Constructor de la clase. Recibe un parametro que sera inyectado en el springmvc-servlet.xml
	 * @param emailRegularExpression
	 */
	public UsuarioValidator(String emailRegularExpression){
		this.emailRegularExpression = emailRegularExpression;
		this.pattern = Pattern.compile(this.emailRegularExpression);
	}
	public RegistroService getRegistroService() {
		return registroService;
	}



	/**
	 * Establecemos la clases que se pueden validar
	 */
	@SuppressWarnings("unchecked")
	@Override
	public boolean supports(Class clazz) {		
		return UsuarioCommand.class.equals(clazz);
	}

	

	/**
	 * Aqui es donde se realiza la validacion
	 */
	@Override
	public void validate(Object command, Errors errors) {
		UsuarioCommand usuario = (UsuarioCommand)command;
		//validaciones para revisar Strings nulos o vacios
		//El segundo parametro es el nombre del atributo del command a revisar, 
		//El tercero es la clave del mensaje de error a desplegar (los mensajes esta en messages.properties)
		//El cuerto parametro es el mensaje por defecto si es que el properties no tiene la clave especificada
		ValidationUtils.rejectIfEmpty(errors, "username", "error.requerido", "campo requerido");
		ValidationUtils.rejectIfEmpty(errors, "nombre", "error.requerido", "campo requerido");
		ValidationUtils.rejectIfEmpty(errors, "apellidos", "error.requerido", "campo requerido");
		ValidationUtils.rejectIfEmpty(errors, "email", "error.requerido", "campo requerido");
		ValidationUtils.rejectIfEmpty(errors, "password", "error.requerido", "campo requerido");
		ValidationUtils.rejectIfEmpty(errors, "password2", "error.requerido", "campo requerido");
		
		//Validaciones personalizadas 
		if(errors.getErrorCount() == 0 ){			
			if(!usuario.getPassword().trim().equals(usuario.getPassword2().trim())){
				errors.rejectValue("password", "error.contrasenas", "Las contraseñas no coinciden.");
			}			
			if(registroService.existsEmail(usuario.getEmail())){
				
				//En este caso mandamos un parametro, estos parametros se insertan en los mensajes
				//especificados en el properties como {0}, {1}, etc. 
				errors.rejectValue("email", "error.existe", new Object[]{"correo"},
						"Ya existe un usuario registrado con este correo.");
			}
			//Usando expresiones regulares para validacion de cadenas
			else if(!pattern.matcher(usuario.getEmail()).matches()){
				errors.rejectValue("email", "error.email", "Correo no válido");
			}
			log.info("Antes de validar username");
			boolean b = registroService.existsUsername(usuario.getUsername());
			log.info("Despues de validar username, resultado--->" + b);
			if(b){
				errors.rejectValue("username", "error.existe", new Object[]{"nombre de usuario"}, 
						"Ya existe un usuario registrado con este nombre de usuario.");
			}
		}
		
	}
	
	public void setRegistroService(RegistroService registroService) {
		this.registroService = registroService;
		
	}
	public void setEmailRegularExpression(String emailRegularExpression) {
		this.emailRegularExpression = emailRegularExpression;
		this.pattern = Pattern.compile(this.emailRegularExpression);
	}

}
